import axios from "axios";
// import sha256 from "crypto-js/sha256";
import { Message, MessageBox } from "element-ui";
import store from "@/store/index";
import { getToken, localstorageGetToken } from "@/utils/auth";

// 创建axios实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API,
  baseURL: "http://192.168.10.143:8098",
  // baseURL: "http://192.168.119.45:8101",
  // baseURL: "https://66.zhihui11.com:8101",
  // baseURL: "https://66.zhihui11.com/english-prod/",
  timeout: 30000, // 请求超时时间
});
const pendings = {};
// 忽略随机参数和随时变的参数
const randomParams = ["useTime", "key", "timestamp", "sign"];
const randomData = ["use_time", "pwd"];
const getPendingId = function (config) {
  const { method, url, params, data } = config;
  let paramsData = params ? Object.assign({}, params) : {};
  let dataData = data ? Object.assign({}, data) : {};
  for (let i in paramsData) {
    if (randomParams.indexOf(i) !== -1) {
      paramsData[i] = null;
    }
  }
  for (let i in dataData) {
    if (randomData.indexOf(i) !== -1) {
      dataData[i] = null;
    }
  }
  return [method, url, JSON.stringify(paramsData), JSON.stringify(dataData)].join("&");
};
/**
 * 添加请求
 */
const addPending = function (config) {
  const id = getPendingId(config);
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken(function excutor(cancel) {
      if (!pendings[id]) {
        pendings[id] = cancel;
      }
    });
  return config;
};

/**
 * 移除请求
 */
const removePending = function (config) {
  const id = getPendingId(config);
  const cancel = pendings[id];

  if (cancel && typeof cancel === "function") {
    cancel("多次请求");
    delete pendings[id];
  }
};
/**
 * 清空所有pending请求
 */
// const clearPending = function() {
//   Object.keys(pendings).forEach((c) => pending[c]());
// };

let isOpenMessage = false;
// request拦截器
service.interceptors.request.use(
  (config) => {
    if (!config.params) {
      config.params = {};
    }
    removePending(config);
    addPending(config);
    // config.params.key = parseInt(Math.random() * 10000, 10);
    // config.params.timestamp = new Date().getTime();
    // config.params.sign = sha256(
    //   `${config.params.key}:guoshi88-plus:${config.params.timestamp}`
    // ).toString();
    if ((getToken() || localstorageGetToken()) && (store.getters.token == getToken() || store.getters.token == localstorageGetToken())) {
      config.headers["Authorization"] = getToken() || localstorageGetToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

// respone拦截器
service.interceptors.response.use(
  (response) => {
    /**
     * code为非200是抛错 可结合自己业务进行修改
     */
    removePending(response);
    const res = response.data;
    if (res.code !== 200 && res.code !== 405) {
      // 401:未登录;
      if (res.code === 401) {
        if (!isOpenMessage) {
          isOpenMessage = true;
          MessageBox.confirm("你已被登出，请重新登录", "确定登出", {
            confirmButtonText: "重新登录",
            showCancelButton: false,
          })
            .then(() => {
              store.dispatch("LogOut").then(() => {
                location.reload(); // 为了重新实例化vue-router对象 避免bug
                this.$router.push({
                  name: "login",
                });
              });
            })
            .catch(() => {
              store.dispatch("LogOut").then(() => {
                location.reload(); // 为了重新实例化vue-router对象 避免bug
                this.$router.push({
                  name: "login",
                });
              });
            });
        }
      } else {
        if (response.config.url == "/student/login") {
          Message({
            message: res.message,
            type: "error",
            duration: 3 * 1000,
          });
        } else if (res.message == "操作失败！该单词已添加") {
          Message({
            message: "该单词已存在单词库中",
            duration: 3 * 1000,
          });
        } else if (res.message == "已添加过该题目") {
          Message({
            message: "已添加过该题目",
            duration: 3 * 1000,
          });
          return Promise.resolve(response);
        } else {
          Message({
            message: "网络有点小问题，请稍后再试哦",
            type: "error",
            duration: 3 * 1000,
          });
        }
        return Promise.reject(response);
      }
    } else {
      isOpenMessage = false;
      return response.data;
    }
  },
  (error) => {
    if (!error.__CANCEL__) {
      // Message({
      //   message: error.message,
      //   type: "error",
      //   duration: 3 * 1000,
      // });
      Message({
        message: "网络有点小问题，请稍后再试哦",
        type: "error",
        duration: 3 * 1000,
      });
    }
    return Promise.reject(error);
  }
);

export default service;
